<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    /* 
      请封装一个函数,可以按照以下调用的方式进行求和
        - add(1,2,3)
        - add(1,2)(3)
        - add(1)(2,3)
        - add(1)(2)(3)
        - add(1,2)(2,2)(3,2)....
    */

    /* function add(...arg) {
      let num = 0;
      //当开始调用add的时候,首先把第一次传入的参数和求出来
      num = arg.reduce((p, c) => p + c, 0);

      const temp = (...arg) => {
        num = arg.reduce((p, c) => p + c, num)
        return temp;
      }

      //重写temp函数的toString方法,当函数转字符串的时候,会隐式转换调用自身的toString方法
      temp.toString = function () {
        return num
      }

      return temp;
    }

    //当函数被alert的时候,会默认调用自身的toString方法
    alert(add(1, 2)(2, 2)(3, 2))
    alert(add(1, 2)(3)) */



    /* function add(...fly) {
      let num = 0
      //求出第一次调用的和
      num = fly.reduce((p, c) => p + c, num)

      //每次调用返回一个函数
      const temp = (...fly) => {
        num = fly.reduce((p, c) => p + c, num)

        return temp;
      }

      temp.toString = function () {
        return num
      }


      return temp

    }

    alert(add(1, 2)(2, 2)(3, 3)); //=> alert(temp)  => temp.toString()  */









    /* 
      请封装一个函数,可以按照以下调用的方式进行求和
        - add(1,2,3)
        - add(1,2)(3)
        - add(1)(2,3)
        - add(1)(2)(3)
        - add(1,2)(2,2)(3,2)....
    */


    /* function add(...fly) {
      let num = 0
      num = fly.reduce((p, c) => p + c ,0)

      const temp = () =>{
        num = fly.reduce((p,c) => p + c ,num)

        return temp
      }

      temp.toString = function(){
        return num
      }

      return temp
    }


    alert(add(1,1)(2,2)(3,3)) */

    function add(...fly) { //不确定接受几个参数所以形参用 rest参数
      let num = 0
      num = fly.reduce((p, c) => p + c, num)

      temp =  (...fly) => { //返回的函数也是做累加
        num = fly.reduce((p, c) => p + c, num)
        return temp //返回的函数的返回值依然是这个累加功能地函数
      }

      //当所有的函数都执行完了返回最后的函数需要被alert
      //alert方法会自动执行该函数的toString方法会输出一个字符串类型的函数
      //所以我们需要重写函数的toString方法让他输出最后算出来的num

      temp.toString = function () {
        return num
      }

      return temp //因为需要连续调用，所以函数的返回值是一个函数 return语句后面不在执行所以写在最后
    }

    alert(add(1, 2)(2, 2)(3, 2)(1,2,3,4,5)(666))
  </script>
</body>

</html>